package br.com.android.financas.repositorio;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.joda.time.DateTime;

import br.com.android.financas.CategoriaTotal;
import br.com.android.financas.MesTotal;
import br.com.android.financas.model.Apresentavel;
import br.com.android.financas.model.Categoria;
import br.com.android.financas.model.Despesa;
import br.com.android.financas.model.Recorrente;

public interface RepositorioDespesa extends Repositorio<Despesa> {

	double getTotal();
	double getTotal(Date mes);
	double getTotal(Date ini, Date fim);
	double getTotal(Categoria categoria);
	double getTotal(Date mes,Categoria categoria);
	List<MesTotal> getTotaisMensais();
	List<MesTotal> getTotaisMensais(Categoria categoria);
	List<MesTotal> getTotaisMensais(Date ini, Date fim);

	List<MesTotal> getTotaisMensais(Date ini, Date fim, Categoria categoria);


	List<Despesa> getDespesas(Categoria categoria);
	List<Despesa> getDespesas(Categoria categoria,Date mes);

	List<Despesa> getDespesas(Date mes);
	List<Despesa> getDespesas(Date ini, Date fim);

	Map<Categoria,List<Despesa>> getCategorias(Date mes);
	Map<Categoria,List<Despesa>> getCategorias(Date ini, Date fim);

	List<CategoriaTotal> getCategoriasTotal(Date mes);
	List<CategoriaTotal> getCategoriasTotal(Date ini, Date fim);

	Map<DateTime, Double> getDespesasMensais(Date ini,Date fim);
	Map<DateTime, Double> getDespesasMensais(Date ini,Date fim, Categoria categoria);

	Map<MesTotal, List<Apresentavel>> getDespesasMensais();
	Map<MesTotal, List<Apresentavel>> getDespesasMensais(Categoria categoria);

	void excluir(Despesa despesa, Date aPartir)throws SQLException;
	void excluir(Despesa despesa, boolean todos) throws SQLException;

	void atualizarGrupo(Despesa despesa, Date aPartir)throws SQLException;
	void atualizarGrupo(Despesa despesa) throws SQLException;
	void atualizarDescricao(Despesa despesa) throws SQLException;

	List<DateTime> getMeses();
	List<DateTime> getMeses(Date mes);

	List<Despesa> getRecorrentes(Recorrente recorrente);
	List<Despesa> getRecorrentes(Recorrente recorrente, Date mes);


}
